Polygon PHP开发包适用于为PHP应用快速增加对Polygon区块链数字资产的支持能力, 即支持使用自有Polygon区块链节点的应用场景,也支持基于Polygon区块链官方节点API服务的 轻量级部署场景。官方下载地址:Polygon PHP开发包。
Polygon PHP开发包主要包含以下特性:
Polygon PHP软件包运行在 Php 7.1+ 环境下,当前版本1.0.0,主要类/接口及关系如下图所示:
Polygon PHP开发包的主要代码文件清单如下:
代码文件 | 说明 |
---|---|
polygon.php/src/Kit.php | Polygon PHP开发包入口类 |
polygon.php/src/Erc20.php | ERC20智能合约封装类 |
polygon.php/src/Erc721.php | ERC721智能合约封装类 |
polygon.php/src/Erc1155.php | ERC1155智能合约封装类 |
polygon.php/src/SmartContract.php | Polygon智能合约封装类 |
polygon.php/src/Credential.php | Polygon区链上身份标识类,用于交易签名 |
polygon.php/src/NodeClient.php | Polygon节点协议封装类 |
polygon.php/src/Callback.php | Php回调辅助类 |
polygon.php/src/Helper.php | 杂项辅助函数集 |
contracts/WizToken.sol | 示例ERC20合约 |
contracts/WizNFT.sol | 示例ERC721合约 |
contracts/WizMT.sol | 示例ERC1155合约 |
bin/build-contracts.sh | 合约编译脚本工具 |
demo/credential-demo.php | 演示如何创建新的Polygon账号或导入已有私钥 |
demo/matic-demo.php | 演示MATIC转账及查询 |
demo/erc20-demo.php | 演示ERC20转账及查询 |
demo/erc20-event-demo.php | 演示ERC20到账监听 |
demo/erc721-demo.php | 演示ERC721转账及查询 |
demo/erc721-event-demo.php | 演示ERC721到账监听 |
demo/erc1155-demo.php | 演示ERC1155转账及查询 |
demo/erc1155-event-demo.php | 演示ERC1155到账监听 |
demo/deploy-contracts-demo.php | 演示代码,智能合约的部署 |
vendor | 第三方依赖包目录 |
composer.json | composer配置文件 |
在使用示例代码之前,请按照实际情况设置demo/config.php
中的以下配置信息:
demo/credential-demo.php
演示了如何使用Polygon PHP开发包创建新的Polygon链上地址,或者导入已有私钥重建账号。
在终端进入演示代码目录,执行如下命令:
1 2 |
~$ cd ~/polygon-php/demo ~/polygon-php/demo$ php credential-demo.php |
执行结果如下:
demo/matic-demo.php
演示了如何使用Polygon PHP开发包实现MATIC转账和余额查询。
在终端进入演示代码目录,执行如下命令:
1 2 |
~$ cd ~/polygon-php/demo ~/polygon-php/demo$ php matic-demo.php |
执行结果如下:
demo/deploy-contracts-demo.php
演示了如何使用Polygon PHP开发包部署ERC20/ERC721/ERC1155智能合约。
在终端进入演示代码目录,执行如下命令:
1 2 |
~$ cd ~/polygon-php/demo ~/polygon-php/demo$ php deploy-contracts-demo.php |
执行结果如下:
demo/erc20-demo.php
演示了如何使用Polygon PHP开发包实现ERC20转账和余额查询等操作。
在终端进入演示代码目录,执行如下命令:
1 2 |
~$ cd ~/polygon-php/demo ~/polygon-php/demo$ php erc20-demo.php |
执行结果如下:
demo/erc20-event-demo.php
演示了如何使用Polygon PHP开发包的合约事件查询功能 实现ERC20通证的到账跟踪。
在终端进入演示代码目录,执行如下命令:
1 2 |
~$ cd ~/polygon-php/demo ~/polygon-php/demo$ php erc20-event-demo.php |
执行结果如下:
demo/erc721-demo.php
演示了如何使用Polygon PHP开发包实现ERC721 NFT转让和查询等操作。
在终端进入演示代码目录,执行如下命令:
1 2 |
~$ cd ~/polygon-php/demo ~/polygon-php/demo$ php erc721-demo.php |
执行结果如下:
demo/erc721-event-demo.php
演示了如何使用Polygon PHP开发包的合约事件查询功能 实现ERC721 NFT的到账跟踪。
在终端进入演示代码目录,执行如下命令:
1 2 |
~$ cd ~/polygon-php/demo ~/polygon-php/demo$ php erc721-event-demo.php |
执行结果如下:
demo/erc1155-demo.php
演示了如何使用Polygon PHP开发包实现ERC1155转让和查询等操作。
在终端进入演示代码目录,执行如下命令:
1 2 |
~$ cd ~/polygon-php/demo ~/polygon-php/demo$ php erc1155-demo.php |
执行结果如下:
demo/erc1155-event-demo.php
演示了如何使用Polygon PHP开发包的合约事件查询功能 实现ERC1155的到账跟踪。
在终端进入演示代码目录,执行如下命令:
1 2 |
~$ cd ~/polygon-php/demo ~/polygon-php/demo$ php erc1155-event-demo.php |
执行结果如下:
Kit类是Polygon PHP开发包的入口,使用这个类可以快速实现如下功能:
Kit实例化需要传入NodeClient
对象和Credential
对象,这两个 参数分别封装了Polygon节点提供的API、以及进行交易签名的用户身份信息。
例如,下面的代码创建一个接入Polygon主链的Kit实例,并使用 指定的私钥进行交易签名:
1 2 3 4 5 6 7 8 |
//use polygon\Kit; //use polygon\NodeClient; //use polygon\Credential; $kit = new Kit( NodeClient::mainNet(), //接入主链 Credential::fromKey('0x87c12d....d435') //使用指定私钥 ); |
使用Kit对象的transfer()
方法进行MATIC转账,例如发送0.1 MATIC:
1 2 3 4 5 6 |
//use polygon\Kit; $to = '0x90F8bf6...0e7944Ea8c9C1'; //转账目标地址 $amount = bn('100000000000000000'); //转账金额,按最小单位 $txid = $kit->transfer($to,$amount); //提交MATIC转账交易 echo 'txid => ' . $txid . PHP_EOL; //显示交易ID |
注意:需要将金额转换为最小单位,由于MATIC的小数位数是18, 因此 0.1 MATIC = 100000000000000000 最小单位。
使用balanceOf()
方法查询指定地址的MATIC余额,例如:
1 2 3 |
$addr = '0x90F8bf6...0e7944Ea8c9C1'; //要查询的Polygon链上地址 $balance = $kit->balanceOf($addr); //查询MATIC余额,按最小单位 echo 'balance => ' . $balance . PHP_EOL; //显示MATIC余额 |
使用Kit对象的erc20()
方法获取指定ERC20合约实例,然后调用合约 的transfer()
方法进行ERC20转账。例如,下面的代码 指定地址间转账123.4567 USDT(合约地址:0xc2132D05D31c914a87C6611C10748AEb04B58e8F):
1 2 3 4 5 6 7 8 |
//use polygon\Kit; $to = '0x90F8bf6A479f320ead074411a4B0e7944Ea8c9C1'; //转账目标地址 $amount = bn('123456700'); //转账ERC20数量 $cOntractAddr= '0xc2132D05D31c914a87C6611C10748AEb04B58e8F' //USDT合约的部署地址 $txid = $kit->erc20($contractAddr) ->transfer($to,$amount); //转账ERC20 echo 'txid => ' . $txid . PHP_EOL; //显示转账交易ID |
使用erc20()
方法获取指定的ERC20合约实例,然后调用合约 的balanceOf()
方法查询ERC20余额。例如,下面的代码查询指定地址 的USDT余额:
1 2 3 4 5 6 |
//use polygon\Kit; $cOntractAddr= '0xc2132D05D31c914a87C6611C10748AEb04B58e8F' //USDT合约的部署地址 $balance = $kit->erc20($contractAddr) ->balanceOf('0x90F8bf6...0e7944Ea8c9C1'); //查询地址0x90F8...的USDT余额 echo 'balance => ' . $balance . PHP_EOL; //显示余额 |
使用erc20()
方法获取指定ERC20合约实例,然后调用 合约实例的getTransferEvents()
方法查询指定条件的转账事件。
可以使用getTransferEvents()
方法跟踪指定地址的到账状态。 例如查询地址0x90F8…在最近1000个区块的USDT代币到账事件:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
//use polygon\Kit; $height = $kit->getBlockHeight(); $cOntractAddr= '0xc2132D05D31c914a87C6611C10748AEb04B58e8F' //USDT合约的部署地址 $events = $kit->erc20($contractAddr) ->getTransferEvents( //查询到账事件 [], //转出账号,空数组表示不要求特定的转出账号 ['0x90F8bf6...0e7944Ea8c9C1'], //接收账号,仅查询地址0x90F8...的到账事件 $height-1000, //查询起始区块号 $height //查询结束区块号 ); foreach($events as $event){ echo 'block => ' . $event->blockNumber . PHP_EOL; //事件发生区块号 echo 'from => ' . $event->params['from'] . PHP_EOL; //转出账号 echo 'to => ' . $event->params['to'] . PHP_EOL; //转入账号 echo 'value => ' . $event->params['value'] . PHP_EOL; //转账金额 } |
getTransferEvents()
方法返回的结果是一个事件对象数组,每个成员对象的主要字段 说明如下:
使用Kit对象的erc721()
方法获取指定ERC721合约实例,然后调用合约 的transferFrom()
方法进行ERC721 NFT转账。例如,下面的代码 指定地址间转让编号为1278的ERC721 NFT(合约地址:0xc2132D05D31c914a87C6611C10748AEb04B58e8F):
1 2 3 4 5 6 7 8 |
//use polygon\Kit; $to = '0x90F8bf6A479f320ead074411a4B0e7944Ea8c9C1'; //目标地址 $tokenId = 1278; //转让的NFT编号 $cOntractAddr= '0xcc739b569624f82f9d7a4f614e47133f37482fed'; //ERC721合约的部署地址 $txid = $kit->erc721($contractAddr) ->transfer($to,$tokenId); //转让指定的ERC721 NFT echo 'txid => ' . $txid . PHP_EOL; //显示交易ID |
使用Kit对象的erc721()
方法获取指定的ERC721合约实例后,可以调用合约的方法查询NFT的 基本信息以及特定编号的NFT的持有人信息等。例如:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
//use Polygon\Kit; $cOntractAddr= '0xcc739b569624f82f9d7a4f614e47133f37482fed'; //ERC721合约的部署地址 $nft = $kit->erc721($contractAddr); //返回ERC721合约实例 echo 'name => ' . $nft->name() . PHP_EOL; echo 'symbol => ' . $nft->symbol() . PHP_EOL; echo 'total supply =>' . $nft->totalSupply() . PHP_EOL; $tokenId = 1278; //NFT编号 echo 'owner => ' . $nft->ownerOf($tokenId); //返回指定NFT的持有人 echo 'token uri => ' . $nft->tokenURI($tokenId) . PHP_EOL; //返回指定NFT的元信息URI $user = '0x90F8bf6A479f320ead074411a4B0e7944Ea8c9C1'; //用户地址 echo 'total nfts => ' . $nft->balanceOf($user) . PHP_EOL; //用户持有的NFT总数 |
使用erc721()
方法获取指定ERC721合约实例,然后调用 合约实例的getTransferEvents()
方法查询指定条件的转账事件。
可以使用getTransferEvents()
方法跟踪指定地址的到账状态。 例如查询地址0x90F8…在最近1000个区块的指定NFT合约到账事件:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
//use polygon\Kit; $height = $kit->getBlockHeight(); $cOntractAddr= '0xcc739b569624f82f9d7a4f614e47133f37482fed'; //ERC721合约的部署地址 $events = $kit->erc721($contractAddr) ->getTransferEvents( //查询到账事件 [], //转出账号,空数组表示不要求特定的转出账号 ['0x90F8bf6...0e7944Ea8c9C1'], //接收账号,仅查询地址0x90F8...的到账事件 $height-1000, //查询起始区块号 $height //查询结束区块号 ); foreach($events as $event){ echo 'block => ' . $event->blockNumber . PHP_EOL; //事件发生区块号 echo 'from => ' . $event->params['from'] . PHP_EOL; //转出账号 echo 'to => ' . $event->params['to'] . PHP_EOL; //转入账号 echo 'tokenId => ' . $event->params['tokenId'] . PHP_EOL; //转让的NFT编号 } |
使用Kit对象的erc1155()
方法获取指定ERC1155合约实例,然后调用合约 的safeTransferFrom()
方法进行ERC1155转账。例如,下面的代码 指定地址间转帐编号为1的ERC1155 NFT(合约地址:0xafefbbab1038a4fd475d685c11b07bd697e20e38):
1 2 3 4 5 6 7 8 9 10 |
//use polygon\Kit; $from = $kit->getSender(); //转出地址 $to = '0x90F8bf6A479f320ead074411a4B0e7944Ea8c9C1'; //目标地址 $tokenId = 1; //转让的通证编号 $value = 1000000; //转让数量 $cOntractAddr= '0xafefbbab1038a4fd475d685c11b07bd697e20e38'; //ERC1155合约的部署地址 $txid = $kit->erc1155($contractAddr) ->safeTransferFrom($from, $to,$tokenId, $value); //转让指定的ERC1155通证 echo 'txid => ' . $txid . PHP_EOL; //显示交易ID |
使用Kit对象的erc1155()
方法获取指定ERC1155合约实例后,可以调用合约的balanceOf()
方法 查询用户持有的ERC1155通证数量。例如:
1 2 3 4 5 6 7 8 |
//use Polygon\Kit; $cOntractAddr= '0xafefbbab1038a4fd475d685c11b07bd697e20e38'; //ERC1155合约的部署地址 $mt = $kit->erc1155($contractAddr); //返回合约实例 $user = '0x90F8bf6A479f320ead074411a4B0e7944Ea8c9C1'; //用户地址 $tokenId = 1; //通证编号 echo 'banalce => ' . $mt->balanceOf($user, $tokenId); //用户持有的指定编号通证的数量 |
使用Kit对象的erc1155()
方法获取指定的ERC1155合约实例,然后调用 合约实例的getTransferEvents()
方法查询指定条件的转账事件。
可以使用getTransferEvents()
方法跟踪指定地址的到账状态。 例如查询地址0x90F8…在最近1000个区块的指定ERC1155通证到账事件:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
//use polygon\Kit; $height = $kit->getBlockHeight(); $cOntractAddr= '0xafefbbab1038a4fd475d685c11b07bd697e20e38'; //ERC1155合约的部署地址 $events = $kit->erc1155($contractAddr) ->getTransferEvents( //查询到账事件 [], //转出账号,空数组表示不要求特定的转出账号 ['0x90F8bf6...0e7944Ea8c9C1'], //接收账号,仅查询地址0x90F8...的到账事件 $height-1000, //查询起始区块号 $height //查询结束区块号 ); foreach($events as $event){ echo 'block => ' . $event->blockNumber . PHP_EOL; //事件发生区块号 echo 'from => ' . $event->params['from'] . PHP_EOL; //转出账号 echo 'to => ' . $event->params['to'] . PHP_EOL; //转入账号 echo 'id => ' . $event->params['id'] . PHP_EOL; //转让的通证编号 echo 'value => ' . $event->params['value'] . PHP_EOL; //转让的通证数量 } |
在Polygon PHP开发包中,使用Credential
对象表征区块链上的一个用户身份,使用普通的 字符串表征区块链上的一个地址,这两者的区别在于Credential包含了用户 的私钥信息,可以用来签名交易,因此需要保护。
使用Credential类的静态方法create()
创建新账户。例如,下面的代码创建一个 新的账户并显示其私钥、公钥和地址:
1 2 3 4 5 6 |
//use polygon\Credential; $credential = Credential::create(); //创建新账号 echo 'private key => ' . $credential->getPrivateKey() . PHP_EOL; //显示私钥 echo 'public key => ' . $credential->getPublicKey() . PHP_EOL; //显示公钥 echo 'address => ' . $credential->getAddress() . PHP_EOL; //显示地址 |
可以使用静态方法fromKey()
导入已有的私钥来实例化Credential。 例如下面的代码导入已有私钥并显示地址:
1 2 3 4 |
//use polygon\Credential; $credential = Credential::fromKey('0x7889...023a'); //导入已有私钥 echo 'address => ' . $credential->getAddress() . PHP_EOL; //显示相应地址 |
NodeClient类封装了Polygon节点的RPC访问协议。实例化NodeClient时,需要指定要连接 的节点URL,例如使用本地的全节点:
1 2 3 |
//use polygon\NodeClient; $client = new NodeClient('http://localhost:8545'); |
当使用Polygon官方节点时,NodeClient类也提供列两个静态函数mainNet()
和testNet()
,分别 用于接入官方提供的主链节点和测试链节点。
例如,下面的代码是等效的:
1 2 3 4 5 6 7 |
//use polygon\NodeClient; $client = new NodeClient('https://rpc-mainnet.maticvigil.com'); $tc = NodeClient::mainNet(); //与上面等效 $tc = new NodeClient('https://rpc-mumbai.maticvigil.com'); $tc = NodeClient::testNet(); //与上面等效 |